import { CanActivate, ExecutionContext, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';

/**
 * 角色守卫
 *
 * 使用方式：
 * @Roles('admin', 'vip')
 * @Get('protected')
 * getProtectedData() { }
 *
 * 只有拥有 admin 或 vip 角色的用户才能访问
 */
@Injectable()
export class RolesGuard implements CanActivate {
  constructor(private reflector: Reflector) {}

  /**
   * 判断是否可以激活
   *
   * @param context 执行上下文
   * @returns 是否可以激活
   */
  canActivate(context: ExecutionContext): boolean {
    // 1.获取路由元数据中的roles
    const requiredRoles = this.reflector.getAllAndOverride<string[]>('roles', [
      context.getHandler(),
      context.getClass(),
    ]);

    // 2.如果没有设置@Roles，则允许访问
    if (!requiredRoles || requiredRoles.length === 0) {
      return true;
    }

    // 3.获取当前用户
    const request = context.switchToHttp().getRequest();
    const user = request.user;

    // 4.如果用户未登录，则拒绝访问
    if (!user) {
      return false;
    }

    // 5.检查用户角色是否在允许的角色列表中
    return requiredRoles.some((role) => user.role === role);
  }
}
